package com.zbmsg.server;

import javax.annotation.PostConstruct;

import org.springframework.stereotype.Service;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
/**
 * 
 * 用户连接后登记。
 * 
 * 控制层来控制是否加入群聊、创建房间等。
 * 
 * redis来记录消息(落地)(内存小的话定时向磁盘写入)
 * 
 * 刚连接时候不要创建 Global.group,只做用户账户数据处理 HashMap<userId,User>
 * 
 * 创建房间时候HashMap<groupId,Global.group> /加入同理
 * 
 * 
 * 用户登入时候就建立了解，不用demo中默认的那个，用messageReceived(ChannelHandlerContext ctx, Object msg)  msg是消息类型  ctx是连接
 */
@Service
public class Server {

	@PostConstruct // spring boot启动时执行
	public void init() {
		new Thread() {
			public void run() {
				new Server().run();
			}
		}.start();
	}

	public void run() {
		System.out.println(
				"==================================================Netty启动==================================================");
		EventLoopGroup boss = new NioEventLoopGroup();// 管理监听每个socket
		EventLoopGroup work = new NioEventLoopGroup();// 执行所有异步io
		try {
			// 启动nio服务，初始化netty服务器，开始监听socket
			ServerBootstrap boot = new ServerBootstrap();
			boot.group(boss, work);
			// 设置非阻塞,用它来建立新accept的连接,用于构造serversocketchannel的工厂类
			boot.channel(NioServerSocketChannel.class);
			// ChildChannelHandler 对出入的数据进行的业务操作,其继承ChannelInitializer
			boot.childHandler(new ChildChannelHandler());
			System.out.println("服务端开启等待客户端连接 ... ...");
			Channel ch = boot.bind(7397).sync().channel();
			ch.closeFuture().sync();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			boss.shutdownGracefully();
			work.shutdownGracefully();
		}
	}
}
